iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
AI/ ML & Data

從投信數據預測葛蘭碧突破後股價走勢系列 第 14

[Day 14] 資料收集與準備-資料前處理(1)

  • 分享至 

  • xImage
  •  

前言

由於從FinMind平台下載的原始數據格式並非直接可用於模型訓練,我們需要進行一系列處理。這是我的流程圖:
https://ithelp.ithome.com.tw/upload/images/20240928/20169373MXpYwJ1sIi.png

本篇我們來講講針對三大法人資料,如何篩選出投信的數據並新增買賣超欄位,接著去除掉無投信介入的股票。

篩選出投信數據並加入買賣超欄位

首先,我們需要篩選出投信相關的資料,並計算每個交易日的買賣超金額。這部分的數據處理將為模型的準確性提供至關重要的基礎,因為投信買賣超數據是股價變動的重要指標之一。

以下是處理投信數據並新增買賣超欄位的Python程式碼:

import os
import pandas as pd

# 設定來源資料夾和目標資料夾
source_folder = r'C:\iThome\day13\fm_i_db' #存有FinMind下載的所有個股csv資料夾
destination_folder = r'C:\iThome\day13\fm_io_db'

# 若目標資料夾不存在,則自動建立以儲存篩選後的結果
if not os.path.exists(destination_folder):
    os.makedirs(destination_folder)

# 讀取來源資料夾內的所有CSV檔案
for filename in os.listdir(source_folder):
    if filename.endswith('.csv'):
        file_path = os.path.join(source_folder, filename)
        
        # 讀取CSV文件,並將其轉換為DataFrame
        df = pd.read_csv(file_path)
        
        # 篩選出name欄位為"Investment_Trust"的行,表示投信的買賣紀錄
        filtered_df = df[df['name'] == 'Investment_Trust']
        
        # 計算投信的買賣超金額,並新增"Buy_Sell_Net"欄位
        filtered_df['Buy_Sell_Net'] = filtered_df['buy'] - filtered_df['sell']
        
        # 儲存處理後的數據至目標資料夾,保持原檔名
        filtered_file_path = os.path.join(destination_folder, filename)
        filtered_df.to_csv(filtered_file_path, index=False)

print("資料處理完成,投信數據已成功篩選並加入買賣超欄位。")

說明:

  1. 自動化資料夾建立:我們使用 os.makedirs() 確保目標資料夾存在,這是防止資料夾未建立而導致文件儲存失敗的預防性措施。
  2. 篩選關鍵數據:程式精確地從 name 欄位篩選出 "Investment_Trust" 這個投信的買賣紀錄,確保只處理與投信行為相關的數據。
  3. 計算買賣超Buy_Sell_Net 欄位反映了每個交易日的淨買賣超。

刪除無投信數據之股票

某些股票可能沒有任何投信的買賣紀錄,這類數據對於我們的分析沒有實際意義,因此需要將它們從資料集中移除。這可以確保資料集的純度,並提高模型的計算效率。

首先,我們需要生成一個包含有投信數據的股票列表。此列表將作為後續資料篩選的依據。

產生包含股票檔名列表的CSV檔案

以下程式碼將遍歷篩選後的資料夾,找出所有含有投信數據的股票檔案,並將這些檔名匯出到一個CSV檔案中,以供後續處理使用。

import os
import pandas as pd

# 設定來源資料夾和目標檔案路徑
source_folder = r'C:\iThome\day13\fm_io_db'
output_csv = r'bsnot0list.csv'

# 用來儲存包含投信買賣超數據的股票檔名前四位
non_zero_files = []

# 遍歷來源資料夾內的所有CSV檔案
for filename in os.listdir(source_folder):
    if filename.endswith('.csv'):
        file_path = os.path.join(source_folder, filename)
        
        # 讀取CSV文件,並將其轉換為DataFrame
        df = pd.read_csv(file_path)
        
        # 檢查"buy"和"sell"欄位是否有非零值,表示有投信買賣紀錄
        if (df['buy'].sum() != 0) or (df['sell'].sum() != 0):
            # 將檔名前四位(股票代號)加入列表
            non_zero_files.append(filename[:4])

# 將檔名前四位儲存至CSV檔案,方便後續篩選
non_zero_df = pd.DataFrame(non_zero_files, columns=['Filename'])
non_zero_df.to_csv(output_csv, index=False)

print(f"包含投信數據的股票編號已儲存至 {output_csv}")

說明:

  1. 資料驗證與篩選:這段程式碼精確地檢查每支股票的投信買賣行為,確保僅保留有實際投信交易的股票。
  2. 自動化流程:程式自動生成包含有效投信數據的股票列表,這可以用於後續篩選資料,保證只處理相關性高的數據,提升計算效率。

刪除無投信數據的股票

接下來,我們使用上一步生成的股票編號列表,將無投信數據的股票從資料集中移除,並將結果儲存到一個新的資料夾中。

import os
import shutil
import pandas as pd

# 讀取包含有效投信數據的股票編號列表
list_file = r'C:\iThome\day13\bsnot0list.csv'
df_list = pd.read_csv(list_file)

# 取得有效的股票檔名前四位數
file_prefix_list = df_list['Filename'].astype(str).tolist()

# 設定資料夾路徑
source_folder = r'C:\iThome\day13\fm_db'
destination_folder = r'C:\iThome\day13\fm_pv_filter'

# 若目標資料夾不存在,則自動建立以儲存篩選後的結果
if not os.path.exists(destination_folder):
    os.makedirs(destination_folder)

# 遍歷來源資料夾內的所有CSV檔案,篩選有效數據
for filename in os.listdir(source_folder):
    if filename[:4] in file_prefix_list and filename.endswith('.csv'):
        source_path = os.path.join(source_folder, filename)
        destination_path = os.path.join(destination_folder, filename)
        
        # 將有效檔案複製到目標資料夾
        shutil.copy(source_path, destination_path)

print("無投信數據的股票已被移除,篩選後的檔案已儲存至目標資料夾。")

說明:

  1. 資料篩選:利用股票編號列表,我們能夠快速篩選出有價值的數據檔案,避免無效數據的干擾,這在大規模資料處理中特別有效。
  2. 自動化流程:透過 shutil.copy() 方法,我們確保篩選出的檔案能夠準確地被複製到指定的資料夾,實現資料清理流程的全自動化。

上一篇
[Day 13] 資料收集與準備-資料來源的優缺點
下一篇
[Day 15] 資料收集與準備 - 資料前處理(2)
系列文
從投信數據預測葛蘭碧突破後股價走勢17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言